/*
# 创建常用联系人表

1. 新表
    - `contacts`
        - `id` (uuid, 主键, 默认: gen_random_uuid())
        - `user_id` (uuid, 外键关联 auth.users, 不为空)
        - `name` (text, 联系人姓名, 不为空)
        - `phone` (text, 联系人手机号, 不为空)
        - `id_card` (text, 联系人身份证号, 不为空)
        - `is_default` (boolean, 是否默认联系人, 默认: false)
        - `created_at` (timestamptz, 创建时间, 默认: now())
        - `updated_at` (timestamptz, 更新时间, 默认: now())

2. 索引
    - 为 user_id 创建索引，提升查询性能
    - 为 user_id + is_default 创建索引

3. 安全策略
    - 启用 RLS
    - 用户只能查看、创建、更新、删除自己的联系人

4. 触发器
    - 自动更新 updated_at 字段
    - 确保每个用户只有一个默认联系人
*/

-- 创建常用联系人表
CREATE TABLE IF NOT EXISTS contacts (
    id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id uuid NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
    name text NOT NULL,
    phone text NOT NULL,
    id_card text NOT NULL,
    is_default boolean DEFAULT false,
    created_at timestamptz DEFAULT now(),
    updated_at timestamptz DEFAULT now()
);

-- 创建索引
CREATE INDEX IF NOT EXISTS idx_contacts_user_id ON contacts(user_id);
CREATE INDEX IF NOT EXISTS idx_contacts_user_default ON contacts(user_id, is_default) WHERE is_default = true;

-- 启用 RLS
ALTER TABLE contacts ENABLE ROW LEVEL SECURITY;

-- 用户可以查看自己的联系人
CREATE POLICY "Users can view own contacts" ON contacts
    FOR SELECT USING (auth.uid() = user_id);

-- 用户可以创建自己的联系人
CREATE POLICY "Users can create own contacts" ON contacts
    FOR INSERT WITH CHECK (auth.uid() = user_id);

-- 用户可以更新自己的联系人
CREATE POLICY "Users can update own contacts" ON contacts
    FOR UPDATE USING (auth.uid() = user_id);

-- 用户可以删除自己的联系人
CREATE POLICY "Users can delete own contacts" ON contacts
    FOR DELETE USING (auth.uid() = user_id);

-- 创建自动更新 updated_at 的触发器函数
CREATE OR REPLACE FUNCTION update_contacts_updated_at()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = now();
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- 创建触发器
DROP TRIGGER IF EXISTS trigger_update_contacts_updated_at ON contacts;
CREATE TRIGGER trigger_update_contacts_updated_at
    BEFORE UPDATE ON contacts
    FOR EACH ROW
    EXECUTE FUNCTION update_contacts_updated_at();

-- 创建确保每个用户只有一个默认联系人的触发器函数
CREATE OR REPLACE FUNCTION ensure_single_default_contact()
RETURNS TRIGGER AS $$
BEGIN
    -- 如果新记录设置为默认联系人
    IF NEW.is_default = true THEN
        -- 将该用户的其他联系人的 is_default 设置为 false
        UPDATE contacts
        SET is_default = false
        WHERE user_id = NEW.user_id AND id != NEW.id;
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- 创建触发器
DROP TRIGGER IF EXISTS trigger_ensure_single_default_contact ON contacts;
CREATE TRIGGER trigger_ensure_single_default_contact
    BEFORE INSERT OR UPDATE ON contacts
    FOR EACH ROW
    EXECUTE FUNCTION ensure_single_default_contact();
